package student.thread.interrupt;

import cn.hutool.core.lang.Console;

/**
 * interrupt
 * interrupt 方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。
 * 注意：线程中断仅仅是置线程的中断状态位，不会停止线程。需要用户自己去监
 * 视线程的状态为并做处理。支持线程中断的方法（也就是线程中断后会抛出
 * interruptedException 的方法）就是在监视线程的中断状态，一旦线程的中断状
 * 态被置为“中断状态”，就会抛出中断异常。
 *
 * interrupted
 * 查询当前线程的中断状态，并且清除原状态。如果一个线程被中断了，第一次调
 * 用 interrupted 则返回 true，第二次和后面的就返回 false 了。
 *
 * isInterrupted
 * 仅仅是查询当前线程的中断状态
 */
public class InterruptThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            Console.log("i= {}", (i + 1));
            Console.log("thread is alive : {}", isAlive());

            // 查询当前线程的中断状态，并且【清除】原状态。
            // 如果一个线程被中断了，第一次调用interrupted 则返回 true，第二次和后面的就返回 false 了。
            Console.log("call inside thread.interrupted()： {}", Thread.interrupted());
        }
    }

    public static void main(String[] args) {
        InterruptThread thread = new InterruptThread();
        thread.start();

        // 中断线程，interrupt 方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。
        thread.interrupt();
        Console.log("thread is alive : {}", thread.isAlive());

        // 判断是否中断
        Console.log("first call isInterrupted(): {}", thread.isInterrupted());
        Console.log("second call isInterrupted(): {}", thread.isInterrupted());

        // 判断是否中断
        Console.log("first call outside thread.interrupted()： {}", Thread.interrupted());
        Console.log("second call outside thread.interrupted() {}：", Thread.interrupted());

        // 线程是否存活，运行状态
        Console.log("thread is alive : {}", thread.isAlive());
    }
}